// types/project.ts

/**
 * 项目状态枚举
 * 定义项目在生命周期中的各个阶段状态
 */
export type ProjectStatus = "进行中" | "已完成"

/**
 * 项目基础接口
 * 包含项目管理系统中项目实体的所有核心属性
 */
export interface Project {
  /** 项目唯一标识符 */
  id: string
  /** 项目名称 */
  name: string
  /** 项目详细描述 */
  description: string
  /** 项目当前状态 */
  status: ProjectStatus
  /** 项目涉及的作物类型 */
  crop_type: string
  /** 项目实施地点 */
  location: string
  /** 项目开始日期，格式：YYYY-MM */
  start_date: string
  /** 项目结束日期，格式：YYYY-MM */
  end_date: string
  /** 项目负责人 */
  manager?: string
  /** 所属实验室代码 */
  laboratory?: string
  /** 所属实验室名称 */
  laboratory_name?: string
  /** 项目预算金额，单位：元 */
  budget: number
  /** 项目目标列表 */
  objectives: string[]
  /** 项目相关附件文件 */
  attachments: ProjectAttachment[]
  /** 项目创建时间，格式：YYYY-MM-DD */
  created_at: string
  /** 项目更新时间，格式：YYYY-MM-DD */
  updated_at: string
}

/**
 * 新建项目表单数据接口
 * 用于项目创建和编辑表单的数据结构
 */
export interface NewProjectForm {
  /** 项目名称 */
  name: string
  /** 项目描述 */
  description: string
  /** 作物类型 */
  crop_type: string
  /** 项目地点 */
  location: string
  /** 开始日期 */
  start_date: string
  /** 结束日期 */
  end_date: string
  /** 项目负责人 */
  manager: string
  /** 项目状态（编辑时可选） */
  status?: ProjectStatus
  /** 项目预算（字符串格式，用于表单输入） */
  budget: string
  /** 项目目标（字符串格式，用于文本域输入） */
  objectives: string
  /** 附件文件列表 */
  attachments: File[]
}

/**
 * 项目附件接口
 * 定义项目中上传文件的属性结构
 */
export interface ProjectAttachment {
  /** 附件唯一标识符 */
  id: string
  /** 附件文件名称 */
  name: string
  /** 附件文件大小，单位：字节 */
  size: number
  /** 附件文件MIME类型 */
  content_type: string
  /** 附件上传时间，ISO格式 */
  uploaded_at: string
  /** 附件上传者姓名，可选 */
  uploaded_by_name?: string
  /** 附件访问URL，可选 */
  url?: string
}

/**
 * 项目筛选条件接口
 * 用于项目列表的搜索和过滤功能
 */
export interface ProjectFilters {
  /** 按项目状态筛选 */
  status?: ProjectStatus
  /** 按作物类型筛选 */
  crop_type?: string

  /** 关键词搜索，支持项目名称和描述 */
  search?: string
}

/**
 * 创建项目请求接口
 * 定义创建新项目时需要提供的数据结构
 */
export interface CreateProjectRequest {
  /** 项目名称，必填 */
  name: string
  /** 项目描述，必填 */
  description: string
  /** 作物类型，必填 */
  crop_type: string
  /** 项目地点，必填 */
  location: string
  /** 开始日期，必填，格式：YYYY-MM */
  start_date: string
  /** 结束日期，必填，格式：YYYY-MM */
  end_date: string
  /** 项目负责人 */
  manager?: string
  /** 项目预算，必填，单位：元 */
  budget: number
  /** 项目目标列表，必填 */
  objectives: string[]
  /** 项目附件列表 */
  attachments?: File[]
}

/**
 * 更新项目请求接口
 * 继承创建项目请求的所有字段，但都设为可选
 * 额外支持状态更新
 */
export interface UpdateProjectRequest extends Partial<CreateProjectRequest> {
  /** 更新项目状态 */
  status?: ProjectStatus
}

/**
 * 项目操作响应接口
 * 标准的项目相关API操作响应格式
 */
export interface ProjectResponse {
  /** 操作结果消息 */
  message: string
  /** 返回的项目数据 */
  project: Project
}

/**
 * 项目列表响应接口
 * 项目列表查询API的响应格式
 */
export interface ProjectListResponse {
  /** 操作结果消息 */
  message: string
  /** 项目列表数据 */
  projects: Project[]
  /** 总项目数量 */
  total: number
  /** 当前页码 */
  page: number
  /** 每页数量 */
  pageSize: number
}

/**
 * 文件上传请求接口
 * 定义项目附件上传时的数据结构
 */
export interface FileUploadRequest {
  /** 要上传的文件对象 */
  file: File
  /** 文件描述信息，可选 */
  description?: string
}

/**
 * 文件上传响应接口
 * 文件上传API的响应格式
 */
export interface FileUploadResponse {
  /** 上传结果消息 */
  message: string
  /** 上传成功后的附件信息 */
  attachment: ProjectAttachment
}

/**
 * API错误响应接口
 * 统一的错误响应格式，用于处理API调用失败的情况
 */
export interface ProjectErrorResponse {
  /** 错误消息 */
  message: string
  /** 错误代码 */
  code?: string
  /** 详细错误信息，字段级别的验证错误 */
  errors?: Record<string, string[]>
}

